package cn.ryh.designpatterndemo.builderpattern;

import java.util.ArrayList;

/**
 * @ClassName Director
 * @Description TODO
 * @Author RaoYH
 * @Date 2019/4/22
 */
public class Director {
    private ArrayList<String> sequence = new ArrayList();
    private MBZBuilder mbzBuilder = new MBZBuilder();
    private BMWBuilder bmwBuilder = new BMWBuilder();

    /**
     * A类型的奔驰车模型,现在执行 doSomething 方法，在执行 doAnything 方法
     * @return
     */
    public MBZ getMBZA(){
        /**
         * ArrayList和HashMap如果定义成类的成员变量，那你在方法中的调用一定要做一个clear的动作，以防止数据混乱。
         */
        this.sequence.clear();
        // A类型的奔驰车模型执行顺序
        this.sequence.add("doSomething");
        this.sequence.add("doAnything");
        // 按照这个顺序返回一个奔驰车
        this.mbzBuilder.setSequence(this.sequence);

        return (MBZ) this.mbzBuilder.getCarModel();
    }
    /**
     * B类型的奔驰车模型,现在执行 doAnything 方法，在执行 doSomething 方法
     * @return
     */
    public MBZ getMBZB(){

        /**
         * ArrayList和HashMap如果定义成类的成员变量，那你在方法中的调用一定要做一个clear的动作，以防止数据混乱。
         */
        this.sequence.clear();
        // A类型的奔驰车模型执行顺序
        this.sequence.add("doAnything");
        this.sequence.add("doSomething");
        // 按照这个顺序返回一个奔驰车
        this.mbzBuilder.setSequence(this.sequence);

        return (MBZ) this.mbzBuilder.getCarModel();
    }

    /**
     * C类型的奔驰车模型,只执行 doAnything 方法
     * @return
     */
    public MBZ getMBZC(){

        /**
         * ArrayList和HashMap如果定义成类的成员变量，那你在方法中的调用一定要做一个clear的动作，以防止数据混乱。
         */
        this.sequence.clear();
        // A类型的奔驰车模型执行顺序
        this.sequence.add("doAnything");
        // 按照这个顺序返回一个奔驰车
        this.mbzBuilder.setSequence(this.sequence);

        return (MBZ) this.mbzBuilder.getCarModel();
    }
    /**
     * A类型的奔驰车模型,现在执行 doSomething 方法，在执行 doAnything 方法
     * @return
     */
    public BMW getBMWA(){

        /**
         * ArrayList和HashMap如果定义成类的成员变量，那你在方法中的调用一定要做一个clear的动作，以防止数据混乱。
         */
        this.sequence.clear();
        // A类型的奔驰车模型执行顺序
        this.sequence.add("doSomething");
        this.sequence.add("doAnything");
        // 按照这个顺序返回一个奔驰车
        this.bmwBuilder.setSequence(this.sequence);

        return (BMW) this.bmwBuilder.getCarModel();
    }
    /**
     * B类型的奔驰车模型,现在执行 doAnything 方法，在执行 doSomething 方法
     * @return
     */
    public BMW getBMWB(){

        /**
         * ArrayList和HashMap如果定义成类的成员变量，那你在方法中的调用一定要做一个clear的动作，以防止数据混乱。
         */
        this.sequence.clear();
        // A类型的奔驰车模型执行顺序
        this.sequence.add("doAnything");
        this.sequence.add("doSomething");
        // 按照这个顺序返回一个奔驰车
        this.bmwBuilder.setSequence(this.sequence);

        return (BMW) this.bmwBuilder.getCarModel();
    }
    /**
     * C类型的奔驰车模型,只执行 doSomething 方法
     * @return
     */
    public BMW getBMWC(){
        /**
         * ArrayList和HashMap如果定义成类的成员变量，那你在方法中的调用一定要做一个clear的动作，以防止数据混乱。
         */
        this.sequence.clear();
        this.sequence.add("doSomething");
        // 按照这个顺序返回一个奔驰车
        this.bmwBuilder.setSequence(this.sequence);

        return (BMW) this.bmwBuilder.getCarModel();
    }

    /**
     * 这里还可以有很多方法，你可以按照不同的执行顺序，生产不同的汽车
     */
}
